//******************************************************************************
/**
 *
 * @file	slot.c
 * @brief	ミニゲーム　スロット
 * @author	kagaya
 * @data	05.07.13
 *
 */
//******************************************************************************
#define SLOT_LOCAL
#include "common.h"
#include "system/procsys.h"
#include "system/bmp_list.h"
#include "system/bmp_menu.h"
#include "system/arc_util.h"
#include "system/arc_tool.h"
#include "system/snd_tool.h"
#include "system/fontproc.h"
#include "system/pm_str.h"
#include "system/msgdata.h"
#include "system/buflen.h"
#include "system/window.h"
#include "system/brightness.h"
#include "system/clact_util.h"
#include "system/clact_tool.h"
#include "system/render_oam.h"
#include "system/palanm.h"
#include "system/wipe.h"
#include "system/window.h"
#include "system/font_arc.h"
#include "system/winframe.naix"
#include "system/snd_radio.h"
#include "gflib/touchpanel.h"
#include "gflib/strbuf_family.h"

#include "application/app_tool.h"
#include "slot_local.h"
#include "slot_main.h"
#include "slot_sub.h"
#include "slot_reel.h"
#include "data/clact_util/clact_header.naix"

//==============================================================================
//	define
//==============================================================================
enum{
 SEQ_FADEIN,
 SEQ_MAIN,
 SEQ_FADEOUT,
 SEQ_EXIT,
};
////////////////////////////////////////////////////////////////
///データ定義
static const TCATS_OAM_INIT slot_coi = {
	0,128,		///< メイン	OAM管理領域・開始/終了
	0,32,		///< メイン	アフィン管理領域・開始/終了
	0,128,		///< サブ	OAM管理領域・開始/終了
	0,32,		///< サブ	アフィン管理領域・開始/終了
};
static const TCATS_CHAR_MANAGER_MAKE slot_ccmm = {
	SLOT_ACTRES_MAX,	//ID制御数
	64*1024,	//メイン画面管理サイズ(byte単位) 0/64kbyte
	16*1024,	//サブ画面管理サイズ(byte単位) 0/16kbyte
	GX_OBJVRAMMODE_CHAR_1D_32K,	//メインOBJモード指定
	GX_OBJVRAMMODE_CHAR_1D_32K,	//サブOBJモード指定
};

///TCATS_RES_ARC
static const TCATS_RESOURCE_FILE_LIST slot_actres_list = {
	NARC_clact_header_slot_chr_resdat,	// キャラクタ
	NARC_clact_header_slot_pal_resdat,	// パレット
	NARC_clact_header_slot_cell_resdat,	// セル
	NARC_clact_header_slot_canm_resdat,	// セルアニメ
	TCATS_RESID_NULL,					// マルチセル
	TCATS_RESID_NULL,					// マルチセルアニメ
	NARC_clact_header_slot_celact_cldat	// ヘッダー
};

//==============================================================================
//	struct
//==============================================================================

//==============================================================================
//	プロトタイプ
//==============================================================================
static void slot_InitDataSet( SLOTMAIN *wk ,SLOT_PARAM* sp);
static void slot_DataReflect( SLOTMAIN *wk );

static BOOL app_Init(SLOTMAIN* wk);
static BOOL app_End(SLOTMAIN* wk);

static int seq_FadeIn(SLOTMAIN* wk);
static int seq_FadeOut(SLOTMAIN* wk);

static void SlotVBlank(void * work);

static void sub_ResInit(SLOTMAIN* wk);
static void sub_ResRelease(SLOTMAIN* wk);
static void sub_GameInit(SLOTMAIN* wk);
static void sub_GameEnd(SLOTMAIN* wk);
static void sub_ViewClear(void);
static void sub_InitialDraw(SLOTMAIN* wk);

static void sub_VBankSet(void);
static void sub_BGLInit(SLOTMAIN* wk);
static void sub_BGLRelease(SLOTMAIN* wk);
static void sub_2DResInit(SLOTMAIN* wk);
static void sub_2DResRelease(SLOTMAIN* wk);
static void sub_MsgDataInit(SLOTMAIN* wk);
static void sub_MsgDataRelease(SLOTMAIN* wk);
static void sub_BmpWinAdd(SLOTMAIN* wk);
static void sub_BmpWinDel(SLOTMAIN* wk);

static void sub_ActorSysInit(SLOTMAIN* wk);
static void sub_ActorSysRelease(SLOTMAIN* wk);
static void sub_ActorInit(SLOTMAIN* wk);
static void sub_ActorRelease(SLOTMAIN* wk);
static void sub_ActorObjMake(SLOTMAIN* wk);
static void sub_ActorObjDelete(SLOTMAIN* wk);

static void sub_ScrnDataGet(SLOTMAIN* wk,SLOT_SCR* sp,int id);
static void sub_BaseMsgDraw(SLOTMAIN* wk);
static void sub_ActorDramMake(SLOTMAIN* wk);

//////////////////////////////////////////////////////////////////////////////
//	↓ここからデバッグ
/////////////////////////////////////////////////////////////////////////////
#ifdef PM_DEBUG
static void debug_BmpWinAdd(SLOTMAIN* wk);
static void debug_BmpWinDel(SLOTMAIN* wk);

#endif	//PM_DEBUG

//////////////////////////////////////////////////////////////////////////////
//	↑ここまでデバッグ
/////////////////////////////////////////////////////////////////////////////
//==============================================================================
//	スロット	プロセス
//==============================================================================
//--------------------------------------------------------------
/**
 * スロットプロセス　初期化
 * @param	proc	プロセスデータ
 * @param	seq		シーケンス
 * @retval	PROC_RESULT	PROC_RESULT
 */
//--------------------------------------------------------------
PROC_RESULT SlotProc_Init( PROC *proc, int *seq )
{
	switch(*seq){
	case 0:
		sub_ViewClear();

		//ワークエリア取得
		HeapStatePush();
		//ヒープ作成
		sys_CreateHeap( HEAPID_BASE_APP, HEAPID_SLOT, 0x20000 );

		{
			SLOTMAIN *wk;

			wk = PROC_AllocWork( proc, sizeof(SLOTMAIN), HEAPID_SLOT );
			MI_CpuClear8(wk,sizeof(SLOTMAIN));

			wk->heapID = HEAPID_SLOT;
			slot_InitDataSet(wk,(SLOT_PARAM*)PROC_GetParentWork(proc));
		}
		(*seq)++;
		break;
	case 1:
		if(app_Init((SLOTMAIN*)PROC_GetWork(proc))){
			return PROC_RES_FINISH;
		}
		break;
	}
	return PROC_RES_CONTINUE;
}

//--------------------------------------------------------------
/**
 * スロットプロセス　メイン
 * @param	proc	プロセスデータ
 * @param	seq		シーケンス
 * @retval	PROC_RESULT	PROC_RESULT
 */
//--------------------------------------------------------------
PROC_RESULT SlotProc_Main( PROC *proc, int *seq )
{
	SLOTMAIN *wk = PROC_GetWork( proc );
	switch(*seq){
	case SEQ_FADEIN:
		*seq = seq_FadeIn(wk);
		break;
	case SEQ_FADEOUT:
		*seq = seq_FadeOut(wk);
		break;
	case SEQ_MAIN:
		if(SlotMain_Game( wk )){
			*seq = SEQ_FADEOUT;
		}
		break;
	case SEQ_EXIT:
		return PROC_RES_FINISH;
	}
	ReelActorMain( wk );
	CATS_Draw(wk->pActRes);
	return PROC_RES_CONTINUE;
}

//--------------------------------------------------------------
/**
 * スロットプロセス　終了
 * @param	proc	プロセスデータ
 * @param	seq		シーケンス
 * @retval	PROC_RESULT	PROC_RESULT
 */
//--------------------------------------------------------------
PROC_RESULT SlotProc_End( PROC *proc, int *seq )
{
	SLOTMAIN *wk = PROC_GetWork( proc );

	if(!app_End(wk)){
		return PROC_RES_CONTINUE;
	}
	sub_ViewClear();
	slot_DataReflect( wk );

	PROC_FreeWork( proc );
	sys_DeleteHeap( HEAPID_SLOT );

	return( PROC_RES_FINISH );
}


//--------------------------------------------------------------
/**
 * @brief	開始時のデータ初期化
 * @param	wk	SLOTMAIN
 * @retval	nothing
 */
//--------------------------------------------------------------
static void slot_InitDataSet( SLOTMAIN *wk ,SLOT_PARAM* sp)
{
	CONFIG* config_sv;

	wk->rec_sv = SaveData_GetRecord(sp->save);
	wk->coin_sv = SaveData_GetMyCoin(sp->save);
	wk->credit = COIN_GetValue(wk->coin_sv);

	config_sv = SaveData_GetConfig(sp->save);
	wk->msg_spd	= CONFIG_GetMsgSpeed(config_sv);
	wk->win_type = CONFIG_GetWindowType(config_sv);

	//現在のキー動作モードを取得
	wk->key_mode = KeyTouchStatus_CheckTouchOrKey((KEYTOUCH_STATUS*)sp->kt_status);

	wk->hard = sp->hard;
	wk->mode  = MODE_NORMAL;
	wk->param = sp;

	wk->old_bgm = PMGS_GetRadioMusicID();
//	wk->old_bgm = Snd_NowBgmNoGet();
	//スコア加算
	RECORD_Score_Add(SaveData_GetRecord(sp->save),SCORE_ID_PLAY_SLOT);
}
//--------------------------------------------------------------
/**
 * @brief	終了時のデータ反映
 * @param	wk	SLOTMAIN
 * @retval	nothing
 */
//--------------------------------------------------------------
static void slot_DataReflect( SLOTMAIN *wk )
{
	u32 credit = wk->credit;
	if( credit > SLOT_COIN_MAX ){
		credit = SLOT_COIN_MAX;
	}
	COIN_Set(wk->coin_sv, credit);

#if 0
	(*slotproc->param->coin) = credit;
	wk->param->r_count = main->bonus_continue_count_max;

	if( wk->param->record != NULL ){
		RECORD_Add( wk->param->record, RECID_SLOT_FEAVER, main->bonus_hit_count );
	}
#endif
}

/**
 *	@brief	初期化
 *
 */
static BOOL app_Init(SLOTMAIN* wk)
{
	switch(wk->main_seq){
	case 0:
		sub_ResInit(wk);
		sub_GameInit(wk);
		++wk->main_seq;
		break;
	case 1:
		sub_InitialDraw(wk);

		//タッチパネル初期化
		InitTPSystem();
		InitTPNoBuff(1);

		Snd_DataSetByScene( SND_SCENE_SUB_PLANTER, 0, 0 );
		wk->main_seq = 0;
		return TRUE;
	}
	return FALSE;

}

/**
 *	@brief	終了処理
 *
 */
static BOOL app_End(SLOTMAIN* wk)
{
	//タッチパネル終了
	StopTP();

	sub_GameEnd(wk);
	sub_ResRelease(wk);
	return TRUE;
}


/**
 *	@brief	フェードイン
 */
static int seq_FadeIn(SLOTMAIN* wk)
{
	switch(wk->main_seq){
	case 0:
		WIPE_SYS_Start(WIPE_PATTERN_WMS,
				WIPE_TYPE_FADEIN,
				WIPE_TYPE_FADEIN,0x0000,COMM_BRIGHTNESS_SYNC,1,wk->heapID
				);
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );
#if 0
		if(wk->old_bgm != SEQ_GS_GAME){
#else
		if(wk->old_bgm != 0){	//元のBGMがラジオ局だったら止める
#endif
			Snd_BgmStop(Snd_NowBgmNoGet(),8);
			PMGS_StopRadio(8);
		}
		++wk->main_seq;
		break;
	case 1:
		if(!WIPE_SYS_EndCheck()){
			break;
		}
#if 0
		if(wk->old_bgm != SEQ_GS_GAME){
#else
		if(wk->old_bgm != 0){	//元のBGMがラジオ局だったらゲームの曲にする
#endif
			Snd_BgmPlay(SEQ_GS_GAME);
		}
		wk->main_seq = 0;
		return SEQ_MAIN;
	}
	return SEQ_FADEIN;
}

/**
 *	@brief	フェードアウト
 */
static int seq_FadeOut(SLOTMAIN* wk)
{
	switch(wk->main_seq){
	case 0:
		WIPE_SYS_Start(WIPE_PATTERN_WMS,
				WIPE_TYPE_FADEOUT,
				WIPE_TYPE_FADEOUT,0x0000,COMM_BRIGHTNESS_SYNC,1,wk->heapID
				);
		wk->old_bgm = Snd_NowBgmNoGet();
		if(wk->old_bgm != SEQ_GS_GAME){
			Snd_BgmStop(Snd_NowBgmNoGet(),8);
		}
		++wk->main_seq;
		break;
	case 1:
		if(!WIPE_SYS_EndCheck()){
			break;
		}
		if(wk->old_bgm != SEQ_GS_GAME){
			Snd_BgmPlay(SEQ_GS_GAME);
		}
		wk->main_seq = 0;
		return SEQ_EXIT;
	}
	return SEQ_FADEOUT;
}

////////////////////////////////////////////////////////////////
///ローカル関数
////////////////////////////////////////////////////////////////
/**
 *	@brief	VBlank関数
 */
static void SlotVBlank(void * work)
{
	SLOTMAIN* wk = (SLOTMAIN*)work;

	//パレット転送
	if( wk->palAnm != NULL ){
		PaletteFadeTrans( wk->palAnm );
	}

	//アクター転送
	if(wk->pActSys != NULL){
		CATS_RenderOamTrans();
	}
	NNS_GfdDoVramTransfer();	//VRam転送マネージャ実行
	GF_BGL_VBlankFunc( wk->bgl );
	OS_SetIrqCheckFlag( OS_IE_V_BLANK);
}

/**
 *	@brief	リソース初期化
 */
static void sub_ResInit(SLOTMAIN* wk)
{
	sub_BGLInit( wk );
	sub_2DResInit( wk );
	sub_MsgDataInit( wk );
	sub_BmpWinAdd( wk );
	sub_ActorInit( wk );

#if 1
#ifdef PM_DEBUG
	debug_BmpWinAdd( wk );
#endif	//PM_DEBUG
#endif
	sys_VBlankFuncChange(SlotVBlank, wk);
}

/**
 *	@brief	リソース解放
 */
static void sub_ResRelease(SLOTMAIN* wk)
{
#if 1
#ifdef PM_DEBUG
	debug_BmpWinDel( wk );
#endif	//PM_DEBUG
#endif
	sub_ActorRelease( wk );
	sub_BmpWinDel( wk );
	sub_MsgDataRelease( wk );
	sub_2DResRelease( wk );
	sub_BGLRelease( wk );
}

/**
 *	@brief	ゲームデータ・コントローラ他初期化
 */
static void sub_GameInit(SLOTMAIN* wk)
{
	ReelControlSet(wk);

	//背景アニメ初期セット
	SlotSub_BguBackAnimeAdd( wk, BGU_BACK_NORMAL);
}

/**
 *	@brief	ゲームデータ・コントローラ他解放
 */
static void sub_GameEnd(SLOTMAIN* wk)
{
	int i;

	//稼働中の背景アニメをリリース
	for(i = 0;i < BGU_BACK_CODE_MAX;i++){
		if(wk->bgu_anm[i].tcb != NULL){
			SlotSub_BguBackAnimeDel( wk, i );
		}
	}

	ReelControlDelete(wk);
}


/*
 *	@brief	ビュー初期化
 */
static void sub_ViewClear(void)
{
	//Blank関数リセット
	sys_VBlankFuncChange(NULL, NULL);
	sys_HBlankIntrStop();	//HBlank割り込み停止

	GF_Disp_GX_VisibleControlInit();
	GF_Disp_GXS_VisibleControlInit();
	GX_SetVisiblePlane(0);
	GXS_SetVisiblePlane(0);
	WIPE_SetBrightness(WIPE_DISP_MAIN,WIPE_FADE_BLACK);
	WIPE_SetBrightness(WIPE_DISP_SUB,WIPE_FADE_BLACK);
	WIPE_ResetWndMask(WIPE_DISP_MAIN);
	WIPE_ResetWndMask(WIPE_DISP_SUB);
}

/*
 *	@brief	初期表示作成
 */
static void sub_InitialDraw(SLOTMAIN* wk)
{
	SlotReel_PosInit(wk);
	SlotReel_ViewInit(wk);
	SlotSub_SysMsgPut(wk,MIDX_SYS_BET);

	SlotSub_BackBtnWrite(wk,BACK_BTN_ACTIVE);
	SlotSub_CoinNumDraw(wk,wk->credit,COIN_NUM_CREDIT);
	SlotSub_CoinNumDraw(wk,0,COIN_NUM_PAYOUT);
	sub_BaseMsgDraw(wk);

}

/**
 *	@brief	vramバンク設定
 */
static void sub_VBankSet(void)
{
	GF_BGL_DISPVRAM vramSetTable = {
		GX_VRAM_BG_128_A,				// メイン2DエンジンのBG
		GX_VRAM_BGEXTPLTT_NONE,			// メイン2DエンジンのBG拡張パレット
		GX_VRAM_SUB_BG_128_C,			// サブ2DエンジンのBG
		GX_VRAM_SUB_BGEXTPLTT_NONE,		// サブ2DエンジンのBG拡張パレット
		GX_VRAM_OBJ_64_E,				// メイン2DエンジンのOBJ
		GX_VRAM_OBJEXTPLTT_NONE,		// メイン2DエンジンのOBJ拡張パレット
		GX_VRAM_SUB_OBJ_16_I,			// サブ2DエンジンのOBJ
		GX_VRAM_SUB_OBJEXTPLTT_NONE,	// サブ2DエンジンのOBJ拡張パレット
		GX_VRAM_TEX_NONE,				// テクスチャイメージスロット
		GX_VRAM_TEXPLTT_NONE			// テクスチャパレットスロット
	};
	GF_Disp_SetBank( &vramSetTable );
}
/*
 *	@brief	BGL初期化
 */
static void sub_BGLInit(SLOTMAIN* wk)
{
	sub_VBankSet();

	wk->bgl = GF_BGL_BglIniAlloc(wk->heapID);
	{	//BG SYSTEM
		GF_BGL_SYS_HEADER BGsys_data = {
			GX_DISPMODE_GRAPHICS,GX_BGMODE_0,GX_BGMODE_0,GX_BG0_AS_2D
		};
		GF_BGL_InitBG(&BGsys_data);
	}
	//上画面をサブ,下画面をメインに切り替え
//	GX_SetDispSelect(GX_DISP_SELECT_SUB_MAIN);

	{	// 上画面　ガイド
		GF_BGL_BGCNT_HEADER TextBgCntDat = {
			0, 0, 0x800, 0, GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0xf800, GX_BG_CHARBASE_0x00000, GX_BG_EXTPLTT_01,
			UFRM_GUIDE_PRI, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( wk->bgl, UFRM_GUIDE, &TextBgCntDat, GF_BGL_MODE_TEXT );
		GF_BGL_ScrClear( wk->bgl, UFRM_GUIDE );
	}
	{	// 上画面　ピクチャーフレーム
		GF_BGL_BGCNT_HEADER TextBgCntDat = {
			0, 0, 0x800, 0, GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0xf000, GX_BG_CHARBASE_0x00000, GX_BG_EXTPLTT_01,
			UFRM_PICT_PRI, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( wk->bgl, UFRM_PICT, &TextBgCntDat, GF_BGL_MODE_TEXT );
		GF_BGL_ScrClear( wk->bgl, UFRM_PICT );
	}
	{	// 上画面　ピクチャーフレーム
		GF_BGL_BGCNT_HEADER TextBgCntDat = {
			0, 0, 0x800, 0, GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0xe800, GX_BG_CHARBASE_0x00000, GX_BG_EXTPLTT_01,
			UFRM_DRAFT_PRI, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( wk->bgl, UFRM_DRAFT, &TextBgCntDat, GF_BGL_MODE_TEXT );
		GF_BGL_ScrClear( wk->bgl, UFRM_DRAFT );
	}
	{	// 上画面　背景
		GF_BGL_BGCNT_HEADER TextBgCntDat = {
			0, 0, 0x800, 0, GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0xe000, GX_BG_CHARBASE_0x10000, GX_BG_EXTPLTT_01,
			UFRM_BACK_PRI, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( wk->bgl, UFRM_BACK, &TextBgCntDat, GF_BGL_MODE_TEXT );
		GF_BGL_ScrClear( wk->bgl, UFRM_BACK );
	}

	{	// 下画面　テキスト面
		GF_BGL_BGCNT_HEADER TextBgCntDat = {
			0, 0, 0x800, 0, GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0xf800, GX_BG_CHARBASE_0x10000, GX_BG_EXTPLTT_01,
			DFRM_MSG_PRI, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( wk->bgl, DFRM_MSG, &TextBgCntDat, GF_BGL_MODE_TEXT );
		GF_BGL_ScrClear( wk->bgl, DFRM_MSG );
	}
	{	// 下画面　メカ
		GF_BGL_BGCNT_HEADER TextBgCntDat = {
			0, 0, 0x800, 0, GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0xf000, GX_BG_CHARBASE_0x00000, GX_BG_EXTPLTT_01,
			DFRM_MECH_PRI, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( wk->bgl, DFRM_MECH, &TextBgCntDat, GF_BGL_MODE_TEXT );
		GF_BGL_ScrClear( wk->bgl, DFRM_MECH );
	}
	{	// 下画面　メカ影
		GF_BGL_BGCNT_HEADER TextBgCntDat = {
			0, 0, 0x800, 0, GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0xe800, GX_BG_CHARBASE_0x00000, GX_BG_EXTPLTT_01,
			DFRM_SHADOW_PRI, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( wk->bgl, DFRM_SHADOW, &TextBgCntDat, GF_BGL_MODE_TEXT );
		GF_BGL_ScrClear( wk->bgl, DFRM_SHADOW );
	}

	GF_BGL_ClearCharSet( UFRM_GUIDE, 32, 0, wk->heapID );
	GF_BGL_ClearCharSet( UFRM_BACK, 32, 0, wk->heapID );
	GF_BGL_ClearCharSet( DFRM_MSG, 32, 0, wk->heapID );
	GF_BGL_ClearCharSet( DFRM_MECH, 32, 0, wk->heapID );

	//ウィンドウマスク設定
	G2_SetWnd0InsidePlane(	GX_WND_PLANEMASK_BG0|
							GX_WND_PLANEMASK_BG2|
							GX_WND_PLANEMASK_BG3|
							GX_WND_PLANEMASK_OBJ, TRUE);
	G2_SetWnd1InsidePlane(	GX_WND_PLANEMASK_BG1, FALSE);
	G2_SetWndOutsidePlane(	GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|
							GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|
							GX_WND_PLANEMASK_OBJ, TRUE);
}

/**
 * @brief	BGL解放
 */
static void sub_BGLRelease(SLOTMAIN* wk)
{
	G2_SetWnd0InsidePlane(	GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|
							GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|
							GX_WND_PLANEMASK_OBJ, TRUE);
	G2_SetWnd1InsidePlane(	GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|
							GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|
							GX_WND_PLANEMASK_OBJ, TRUE);
	G2_SetWndOutsidePlane(	GX_WND_PLANEMASK_BG0|GX_WND_PLANEMASK_BG1|
							GX_WND_PLANEMASK_BG2|GX_WND_PLANEMASK_BG3|
							GX_WND_PLANEMASK_OBJ, TRUE);

	GF_BGL_BGControlExit(wk->bgl, DFRM_SHADOW );
	GF_BGL_BGControlExit(wk->bgl, DFRM_MECH );
	GF_BGL_BGControlExit(wk->bgl, DFRM_MSG );
	GF_BGL_BGControlExit(wk->bgl, UFRM_BACK );
	GF_BGL_BGControlExit(wk->bgl, UFRM_DRAFT );
	GF_BGL_BGControlExit(wk->bgl, UFRM_PICT );
	GF_BGL_BGControlExit(wk->bgl, UFRM_GUIDE );

	sys_FreeMemoryEz(wk->bgl);

	//上画面をメイン,下画面をサブに戻す
	GX_SetDispSelect(GX_DISP_SELECT_MAIN_SUB);
}
/**
 * @brief	2Dリソース初期化
 */
static void sub_2DResInit(SLOTMAIN* wk)
{
	int i;

	ARCHANDLE* handle;

	//アーカイブのハンドルを取得
	handle = ArchiveDataHandleOpen(ARC_SLOT,wk->heapID);
	wk->gra_h = handle;

	//パレットアニメコントローラー確保
	wk->palAnm = PaletteFadeInit(wk->heapID);
	PaletteFadeWorkAllocSet( wk->palAnm, FADE_MAIN_BG, FADE_PAL_ONE_SIZE*SLOT_BG_PALMAX,wk->heapID);
	PaletteFadeWorkAllocSet( wk->palAnm, FADE_SUB_BG, FADE_PAL_ONE_SIZE*SLOT_BG_PALMAX,wk->heapID);
	PaletteFadeWorkAllocSet( wk->palAnm, FADE_MAIN_OBJ, FADE_PAL_ONE_SIZE*SLOT_OBJ_PALMAX,wk->heapID);
	PaletteFadeWorkAllocSet( wk->palAnm, FADE_SUB_OBJ, FADE_PAL_ONE_SIZE*SLOT_OBJ_PALMAX,wk->heapID);

	PaletteWorkSetEx_ArcHandle(wk->palAnm,handle,
		NARC_slot_gs_gra_bg_u_nclr,wk->heapID,FADE_MAIN_BG,FADE_PAL_ONE_SIZE*SLOT_BG_PALMAX,0,0);
	PaletteWorkSetEx_ArcHandle(wk->palAnm,handle,
		NARC_slot_gs_gra_bg_d_nclr,wk->heapID,FADE_SUB_BG,FADE_PAL_ONE_SIZE*SLOT_BG_PALMAX,0,0);
	PaletteWorkSetEx_ArcHandle(wk->palAnm,handle,
		NARC_slot_gs_gra_obj_u_nclr,wk->heapID,FADE_MAIN_OBJ,FADE_PAL_ONE_SIZE*SLOT_OBJ_PALMAX,0,0);
	PaletteWorkSetEx_ArcHandle(wk->palAnm,handle,
		NARC_slot_gs_gra_obj_d_nclr,wk->heapID,FADE_SUB_OBJ,FADE_PAL_ONE_SIZE*SLOT_OBJ_PALMAX,0,0);

	//上画面背景転送
	ArcUtil_HDL_BgCharSet( handle,
			NARC_slot_gs_gra_efct_u_ncgr, wk->bgl, UFRM_BACK, 0, 0, FALSE, wk->heapID);
	ArcUtil_HDL_ScrnSet( handle,
			NARC_slot_gs_gra_efct01_u_nscr, wk->bgl, UFRM_BACK, 0, 0, FALSE, wk->heapID);
	ArcUtil_HDL_BgCharSet( handle,
			NARC_slot_gs_gra_bg_u_ncgr, wk->bgl, UFRM_GUIDE, 0, 0, FALSE, wk->heapID);
	ArcUtil_HDL_ScrnSet( handle,
			NARC_slot_gs_gra_bg_u_nscr, wk->bgl, UFRM_GUIDE, 0, 0, FALSE, wk->heapID);

	//下画面背景転送
	ArcUtil_HDL_BgCharSet( handle,
		NARC_slot_gs_gra_bg_d_ncgr, wk->bgl, DFRM_MECH, 0, 0, FALSE, wk->heapID);
	ArcUtil_HDL_ScrnSet( handle,
		NARC_slot_gs_gra_bg_d_nscr, wk->bgl, DFRM_MECH, 0, 0, FALSE, wk->heapID);
	ArcUtil_HDL_ScrnSet( handle,
		NARC_slot_gs_gra_shadow_d_nscr, wk->bgl, DFRM_SHADOW, 0, 0, FALSE, wk->heapID);

	//スクリーンリソース取得
	sub_ScrnDataGet(wk,&wk->sd_num,NARC_slot_gs_gra_num_d_nscr);
	sub_ScrnDataGet(wk,&wk->su_guide,NARC_slot_gs_gra_guid_u_nscr);
	sub_ScrnDataGet(wk,&wk->su_pict,NARC_slot_gs_gra_pict_u_nscr);

	for(i = 0;i < SLOT_MCHG_ANM_NUM;i++){
		sub_ScrnDataGet(wk,&wk->su_anm[i],NARC_slot_gs_gra_efct01_u_nscr+i);
	}

	//パレットデータ取得
	wk->pu_back.buf = ArcUtil_HDL_PalDataGet( handle,
			NARC_slot_gs_gra_efct_u_nclr, &wk->pu_back.pal, wk->heapID );
	wk->pu_back.dat = (u16*)wk->pu_back.pal->pRawData;


	//会話ウインドウグラフィック転送
	TalkWinGraphicSet(wk->bgl,DFRM_MSG,
		BMP_TALK_WIN_CGX, BMP_TALK_WIN_PAL,wk->win_type, wk->heapID);
	TalkFontPaletteLoad( PALTYPE_SUB_BG, TALK_FONT_PAL*0x20, wk->heapID );

	//パレット初期転送
	PaletteTrans_AutoSet(wk->palAnm,TRUE);
	PaletteFadeTrans( wk->palAnm );

	//ブレンド設定
	G2S_SetBlendAlpha(ALPHA_MASK_1ST,ALPHA_MASK_2ND,ALPHA_SECOND,ALPHA_FIRST);
}

/**
 * @brief	2Dリソース解放
 */
static void sub_2DResRelease(SLOTMAIN* wk)
{
	int i;

	G2S_SetBlendAlpha(GX_BLEND_PLANEMASK_NONE,GX_BLEND_PLANEMASK_NONE,31,0);

	for(i = 0;i < SLOT_MCHG_ANM_NUM;i++){
		sys_FreeMemoryEz(wk->su_anm[i].buf);
	}
	sys_FreeMemoryEz(wk->pu_back.buf);
	sys_FreeMemoryEz(wk->su_pict.buf);
	sys_FreeMemoryEz(wk->su_guide.buf);
	sys_FreeMemoryEz(wk->sd_num.buf);

	// パレットフェード開放
	PaletteFadeWorkAllocFree( wk->palAnm, FADE_SUB_OBJ );
	PaletteFadeWorkAllocFree( wk->palAnm, FADE_MAIN_OBJ );
	PaletteFadeWorkAllocFree( wk->palAnm, FADE_SUB_BG );
	PaletteFadeWorkAllocFree( wk->palAnm, FADE_MAIN_BG );

	//パレットフェードシステム開放
	PaletteFadeFree( wk->palAnm );

	//ハンドル解放
	ArchiveDataHandleClose( wk->gra_h );
}

/**
 *	@brief	メッセージデータ初期化
 */
static void sub_MsgDataInit(SLOTMAIN* wk)
{
	int i;

	//タッチフォントロード
	FontProc_LoadFont(FONT_TOUCH,wk->heapID);

	wk->msg.man = MSGMAN_Create(MSGMAN_TYPE_NORMAL,ARC_MSG,
			NARC_msg_slot_dat,wk->heapID);

	wk->msg.wset = WORDSET_CreateEx(WORDSET_SLOT_BUFNUM,WORDSET_SLOT_BUFLEN,wk->heapID);
	wk->msg.tmp = STRBUF_Create(SLOT_MSG_BUFLEN,wk->heapID);
	wk->msg.str = STRBUF_Create(SLOT_MSG_BUFLEN,wk->heapID);
}

/**
 *	@brief	メッセージデータ解放
 */
static void sub_MsgDataRelease(SLOTMAIN* wk)
{
	int i;

	STRBUF_Delete(wk->msg.str);
	STRBUF_Delete(wk->msg.tmp);
	WORDSET_Delete(wk->msg.wset);

	MSGMAN_Delete(wk->msg.man);

	//タッチフォントアンロード
	FontProc_UnloadFont(FONT_TOUCH);
}

/**
 *	@brief	BMPウィンドウ初期化
 */
static void sub_BmpWinAdd(SLOTMAIN* wk)
{
	int i;
	static const BMPWIN_DAT BmpWinData[] = {
	 {	// 「メッセージウィンドウ」
		BMP_MSG_FRM, BMP_MSG_PX, BMP_MSG_PY,
		BMP_MSG_SX, BMP_MSG_SY, BMP_MSG_PAL, BMP_MSG_CGX
	 },
	 {	// 「説明ウィンドウ」
		BMP_EXP_FRM, BMP_EXP_PX, BMP_EXP_PY,
		BMP_EXP_SX, BMP_EXP_SY, BMP_EXP_PAL, BMP_EXP_CGX
	 },
	 {	// 「操作説明文字列ウィンドウ」
		BMP_CON_FRM, BMP_CON01_PX, BMP_CON_PY,
		BMP_CON_SX, BMP_CON_SY, BMP_CON_PAL, BMP_CON01_CGX
	 },
	 {	// 「操作説明文字列ウィンドウ」
		BMP_CON_FRM, BMP_CON02_PX, BMP_CON_PY,
		BMP_CON_SX, BMP_CON_SY, BMP_CON_PAL, BMP_CON02_CGX
	 },
	 {	// 「操作説明文字列ウィンドウ」
		BMP_CON_FRM, BMP_CON03_PX, BMP_CON_PY,
		BMP_CON_SX, BMP_CON_SY, BMP_CON_PAL, BMP_CON03_CGX
	 },
	};

	for( i=0; i<WIN_MAX; i++ ){
		GF_BGL_BmpWinAddEx( wk->bgl, &wk->win[i], &BmpWinData[i] );
		GF_BGL_BmpWinDataFill( &wk->win[i], 0 );
	}

	//YesNoボタンシステムワーク確保
	wk->ynbtn_wk = TOUCH_SW_AllocWork(wk->heapID);
}

/**
 *	@brief	BMPウィンドウ解放
 */
static void sub_BmpWinDel(SLOTMAIN* wk)
{
	int i;
	for( i=0; i<WIN_MAX; i++ ){
		GF_BGL_BmpWinOff( &wk->win[i] );
		GF_BGL_BmpWinDel( &wk->win[i] );
	}
	//YesNoボタンシステムワーク解放
	TOUCH_SW_FreeWork( wk->ynbtn_wk );
}

/**
 *	@brief	セルアクターシステム初期化
 */
static void sub_ActorSysInit(SLOTMAIN* wk)
{
	initVramTransferManagerHeap(32,wk->heapID);

	//セルアクターシステム初期化
	wk->pActSys = CATS_AllocMemory(wk->heapID);

	CATS_SystemInit( wk->pActSys,
		&slot_coi,&slot_ccmm,SLOT_ACTPAL_NUM );

	//OAM初期化
	REND_OAM_UtilOamRamClear_Main(wk->heapID);
	REND_OAM_UtilOamRamClear_Sub(wk->heapID);

	//セルアクターリソース初期化
	wk->pActRes = CATS_ResourceCreate(wk->pActSys);
	CATS_ClactSetInit( wk->pActSys, wk->pActRes,SLOT_ACTMAX);

	CATS_ResourceLoadBinaryEx( wk->pActSys, wk->pActRes,
		&slot_actres_list,CATS_CGXOFS_AREA,CATS_PLTTOFS_AREA);
}

/**
 *	@brief	セルアクターシステム解放
 */
static void sub_ActorSysRelease(SLOTMAIN* wk)
{
	//リソース解放
	CATS_ResourceDestructor(wk->pActSys,wk->pActRes);
	wk->pActRes = NULL;

	//システムワーク解放
	CATS_FreeMemory(wk->pActSys);
	wk->pActSys = NULL;
	DellVramTransferManager();

	//OAM初期化
	REND_OAM_UtilOamRamClear_Main(wk->heapID);
	REND_OAM_UtilOamRamClear_Sub(wk->heapID);
}
/*
 *	@brief	セルアクター初期化
 */
static void sub_ActorInit(SLOTMAIN* wk)
{
	sub_ActorSysInit(wk);
	sub_ActorObjMake(wk);
	sub_ActorDramMake(wk);

	GF_Disp_GX_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );
}

/**
 *	@brief	セルアクター解放
 */
static void sub_ActorRelease(SLOTMAIN* wk)
{
	GF_Disp_GX_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_OFF );
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_OFF );

	sub_ActorObjDelete(wk);
	sub_ActorSysRelease(wk);
}

/**
 *	@brief	ノーマルアクター生成
 */
static void sub_ActorObjMake(SLOTMAIN* wk)
{
		int i;
	u8	idx;

	static const TCATS_OBJECT_ADD_PARAM	ActAddParam[] =
	{
		{	// 戻るボタン
			ACTRES_DOWN,	//ID
			ACT_BACK_PX, ACT_BACK_PY, 0,	//x,y,z
			ANMD_BACK, ACTD_SPRI_BACK, 0, NNS_G2D_VRAM_TYPE_2DSUB,	//anmNO,pri,pal,d_area
			TCATS_PALMODE_AUTO, 0, 0, 0	//prm1,prm2,prm3,prm4
		},
		{	// ドーブル
			ACTRES_UP,	//ID
			ACT_DBR_PX, ACT_DBR_PY, 0,	//x,y,z
			ANMU_DBR_F, ACTU_SPRI_DBL, 0, NNS_G2D_VRAM_TYPE_2DMAIN,	//anmNO,pri,pal,d_area
			TCATS_PALMODE_AUTO, 0, 0, 0	//prm1,prm2,prm3,prm4
		},
		{	// カンバス
			ACTRES_UP,	//ID
			ACT_CUNVAS_PX, ACT_CUNVAS_PY, 0,	//x,y,z
			ANMU_CUNVAS, ACTU_SPRI_CUNVAS, 0, NNS_G2D_VRAM_TYPE_2DMAIN,	//anmNO,pri,pal,d_area
			TCATS_PALMODE_AUTO, 0, 0, 0	//prm1,prm2,prm3,prm4
		},
		{	// 噴出し
			ACTRES_UP,	//ID
			0, 0, 0,	//x,y,z
			ANMU_ICON_ONPU, ACTU_SPRI_ICON, 0, NNS_G2D_VRAM_TYPE_2DMAIN,	//anmNO,pri,pal,d_area
			TCATS_PALMODE_AUTO, 0, 0, 0	//prm1,prm2,prm3,prm4
		},
	};

	for(i = 0;i <= ACT_CUNVAS;i++){
		wk->pAct[i] = CATS_ObjectAdd( wk->pActSys, wk->pActRes, &ActAddParam[i] );
//		CLACT_SetAnmFrame(wk->pAct[i], FX32_ONE);
		CLACT_SetDrawFlag(wk->pAct[i], TRUE );
		CLACT_SetAnmFlag(wk->pAct[i], TRUE);
	}
	for(i = 0;i < ACT_ICONMAX;i++){
		wk->pAct[ACT_ICON01+i] = CATS_ObjectAdd( wk->pActSys, wk->pActRes, &ActAddParam[3] );
		CLACT_SetDrawFlag(wk->pAct[ACT_ICON01+i], FALSE );
		CLACT_SetAnmFlag(wk->pAct[ACT_ICON01+i], TRUE);
		CLACT_SetAnmFrame(wk->pAct[ACT_ICON01+i], FX32_ONE);
		CLACT_SetAffineParam( wk->pAct[ACT_ICON01+i], CLACT_AFFINE_NORMAL);
	}
	CLACT_BGPriorityChg( wk->pAct[ACT_BACK], DFRM_MSG_PRI );
	CLACT_BGPriorityChg( wk->pAct[ACT_CUNVAS], UFRM_BACK_PRI );
}

/**
 *	@brief	ドラムアクター生成
 */
static void sub_ActorDramMake(SLOTMAIN* wk)
{
	int i,j;
	u8	idx;

	static const TCATS_OBJECT_ADD_PARAM	ActAddParam =
	{	// ドラム
		ACTRES_DOWN,	//ID
		ACT_REEL_PX, ACT_REEL_PY, 0,	//x,y,z
		ANMD_REEL_SEVEN, ACTD_SPRI_REEL, 0, NNS_G2D_VRAM_TYPE_2DSUB,	//anmNO,pri,pal,d_area
		TCATS_PALMODE_AUTO, 0, 0, 0	//prm1,prm2,prm3,prm4
	};

	for(i = 0;i < REEL_LINE_Y;i++){
		for(j = 0;j < REEL_LINE_X;j++){
			idx = i*REEL_LINE_X+j;
			wk->pAReel[idx] = CATS_ObjectAdd( wk->pActSys, wk->pActRes, &ActAddParam );
			CATS_ObjectPosSet(wk->pAReel[idx],
				(ACT_REEL_OX*j)+ACT_REEL_PX ,(ACT_REEL_OY*i)+ACT_REEL_PY );
//			CLACT_SetAnmFrame(wk->pAReel[idx], FX32_ONE);
			CLACT_SetDrawFlag(wk->pAReel[idx], TRUE );
			CLACT_SetAnmFlag(wk->pAReel[idx], TRUE);
			CLACT_BGPriorityChg( wk->pAReel[idx], DFRM_REEL_PRI );
		}
	}
}

/**
 *	@brief	セルアクターオブジェクト削除
 */
static void sub_ActorObjDelete(SLOTMAIN* wk)
{
	int i;

	for(i = 0;i < REEL_ACTMAX;i++){
		if(wk->pAReel[i] != NULL){
			CLACT_Delete(wk->pAReel[i]);
		}
	}
	for(i = 0;i < SYS_ACTMAX;i++){
		if(wk->pAct[i] != NULL){
			CLACT_Delete(wk->pAct[i]);
		}
	}
}

/**
 *	@brief	スクリーンデータ取得
 */
static void sub_ScrnDataGet(SLOTMAIN* wk,SLOT_SCR* sp,int id)
{
	sp->buf = ArcUtil_HDL_ScrnDataGet(wk->gra_h,id,FALSE,&sp->scr,wk->heapID);
	sp->siz_x = sp->scr->screenWidth/8;
	sp->siz_y = sp->scr->screenHeight/8;
	sp->dat = (u8*)sp->scr->rawData;
}

/**
 *	@brief	ベース文字列表示
 */
static void sub_BaseMsgDraw(SLOTMAIN* wk)
{
	int i;
	GF_BGL_BMPWIN* win;

	for(i = 0;i < 3;i++){
		win = &wk->win[WIN_CON01+i];
		GF_BGL_BmpWinDataFill(win,FCOL_SYS_BLACK);
		MSGMAN_GetString(wk->msg.man,msg_con01+i,wk->msg.str);

		GF_STR_PrintColor( win, FONT_SYSTEM, wk->msg.str,
			0,0, MSG_NO_PUT, FCOL_SYS_B_GREEN , NULL );
		GF_BGL_BmpWinOnVReq(win);
	}
}

//////////////////////////////////////////////////////////////////////////////
//	↓ここからデバッグ
/////////////////////////////////////////////////////////////////////////////
#ifdef PM_DEBUG

static void debug_BmpWinAdd(SLOTMAIN* wk)
{
	static const BMPWIN_DAT BmpWinData = {
	 // 「メッセージウィンドウ」
		BMP_DEB_FRM, BMP_DEB_PX, BMP_DEB_PY,
		BMP_DEB_SX, BMP_DEB_SY, BMP_DEB_PAL, BMP_DEB_CGX
	};
	GF_BGL_BmpWinAddEx( wk->bgl, &wk->deb_win, &BmpWinData );
	GF_BGL_BmpWinDataFill( &wk->deb_win, 0x0 );
}

static void debug_BmpWinDel(SLOTMAIN* wk)
{
	GF_BGL_BmpWinOff( &wk->deb_win );
	GF_BGL_BmpWinDel( &wk->deb_win );
}

#endif	//PM_DEBUG
//////////////////////////////////////////////////////////////////////////////
//	↑ここまでデバッグ
/////////////////////////////////////////////////////////////////////////////

